home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Linux Cubed Series 7: Sunsite
/
Linux Cubed Series 7 - Sunsite Vol 1.iso
/
system
/
news
/
inn1.000
/
inn1.4sec-linux-src.tar
/
inn
/
samples
/
nntpsend
< prev
next >
Wrap
Text File
|
1993-01-29
|
6KB
|
279 lines
#! /bin/sh
## $Revision: 1.8 $
## Send news via NNTP by running several innxmit processes in the background.
## Usage:
## nntpsend [-p][-r][-s size][-S][-t timeout][-T limit][host fqdn]...
## -p Run innxmit with -p to prune batch files
## -r innxmit, don't requeue on unexpected error code
## -s size limit the .nntp file to size bytes
## -S send via xreplic protocol (send to a slave site)
## -t timeout innxmit timeout to make connection (def: 180)
## -T limit innxmit connection transmit time limit (def: forever)
## host fqdn send to host and qualified domain (def: nntpsend.ctl)
## If no "host fqdn" pairs appear on the command line, then ${CTLFILE}
## file is read.
## =()<. @<_PATH_SHELLVARS>@>()=
. /news/lib/innshellvars
PROGNAME=`basename $0`
LOCK=${LOCKS}/LOCK.${PROGNAME}
CTLFILE=${NEWSLIB}/${PROGNAME}.ctl
LOG=${MOST_LOGS}/${PROGNAME}.log
## Set defaults.
D_FLAG=
P_FLAG=
R_FLAG=
S_FLAG=
TRUNC_SIZE=
T_FLAG=
TIMELIMIT=
## Parse JCL.
MORETODO=true
while ${MORETODO} ; do
case X"$1" in
X-d)
D_FLAG="-d"
;;
X-p)
P_FLAG="-p"
;;
X-r)
R_FLAG="-r"
;;
X-S)
S_FLAG="-S"
;;
X-s)
if [ -z "$2" ] ; then
echo "${PROGNAME}: option requires an argument -- s" 1>&2
exit 1
fi
TRUNC_SIZE="$2"
shift
;;
X-s*)
TRUNC_SIZE="`echo $2 | ${SED} -e 's/-s//'`"
;;
X-t)
if [ -z "$2" ] ; then
echo "${PROGNAME}: option requires an argument -- t" 1>&2
exit 1
fi
T_FLAG="-t$2"
shift
;;
X-t*)
T_FLAG="$1"
;;
X-T)
if [ -z "$2" ] ; then
echo "${PROGNAME}: option requires an argument -- T" 1>&2
exit 1
fi
TIMELIMIT="-T$2"
shift
;;
X-T*)
TIMELIMIT="$1"
;;
X--)
shift
MORETODO=false
;;
X-*)
echo "${PROGNAME}: illegal option -- $1" 1>&2
exit 1
;;
*)
MORETODO=false
;;
esac
${MORETODO} && shift
done
## Parse arguments; host/fqdn pairs.
INPUT=${TMPDIR}/nntpsend$$
cp /dev/null ${INPUT}
while [ $# -gt 0 ]; do
if [ $# -lt 2 ]; then
echo "${PROGNAME}: Bad host/fqdn pair" 1>&2
exit 1
fi
echo "$1 $2" >>${INPUT}
shift
shift
done
## If nothing specified on the command line, read the control file.
if [ ! -s ${INPUT} ] ; then
if [ ! -r ${CTLFILE} ]; then
echo "${PROGNAME}: cannot read ${CTLFILE}"
exit 1
fi
${SED} -e 's/#.*//' -e '/^$/d' -e 's/::\([^:]*\)$/:max:\1/' \
-e 's/:/ /g' <${CTLFILE} >${INPUT}
fi
## Go to where the action is.
if [ ! -d ${BATCH} ]; then
echo "${PROGNAME}: directory ${BATCH} not found" 1>&2
exit 1
fi
cd ${BATCH}
## Set up log file.
umask 002
if [ -z "${D_FLAG}" ]; then
test ! -f ${LOG} && touch ${LOG}
chmod 0660 ${LOG}
exec >>${LOG} 2>&1
fi
PPID=$$
echo "${PROGNAME}: [${PPID}] start"
## Set up environment.
export BATCH PROGNAME PPID INNFLAGS
## Loop over all sites.
cat ${INPUT} | while read SITE HOST MAXSIZE FLAGS; do
## Parse the input parameters.
if [ -z "${SITE}" -o -z "${HOST}" ] ; then
echo "Ignoring bad line: ${SITE} ${HOST} ${MAXSIZE} ${FLAGS}" 1>&2
continue
fi
test "${MAXSIZE}" = "max" && MAXSIZE=
## Compute the specific parameters for this site.
if [ -n "${TRUNC_SIZE}" ]; then
SIZE="${TRUNC_SIZE}"
else
SIZE="${MAXSIZE}"
fi
D_PARAM=
R_PARAM=
S_PARAM=
TIMEOUT_PARAM=
TIMELIMIT_PARAM=
if [ -z "${FLAGS}" ]; then
MORETODO=false
else
MORETODO=true
set - ${FLAGS}
fi
while ${MORETODO} ; do
case "X$1" in
X-a)
;;
X-d)
D_PARAM="-d"
;;
X-p)
P_PARAM="-p"
;;
X-r)
R_PARAM="-r"
;;
X-S)
S_PARAM="-S"
;;
X-t)
if [ -z "$2" ] ; then
echo "${PROGNAME}: option requires an argument -- t" 1>&2
exit 1
fi
TIMEOUT_PARAM="-t$2"
shift
;;
X-t*)
TIMEOUT_PARAM="$1"
;;
X-T)
if [ -z "$2" ] ; then
echo "${PROGNAME}: option requires an argument -- T" 1>&2
exit 1
fi
TIMELIMIT_PARAM="-T$2"
shift
;;
X-T*)
TIMELIMIT_PARAM="$1"
;;
*)
MORETODO=false
;;
esac
${MORETODO} && shift
done
INNFLAGS="-a"
if [ -n "${D_FLAG}" ]; then
INNFLAGS="${INNFLAGS} ${D_FLAG}"
else
test -n "${D_PARAM}" && INNFLAGS="${INNFLAGS} ${D_PARAM}"
fi
if [ -n "${P_FLAG}" ]; then
INNFLAGS="${INNFLAGS} ${P_FLAG}"
else
test -n "${P_PARAM}" && INNFLAGS="${INNFLAGS} ${P_PARAM}"
fi
if [ -n "${R_FLAG}" ]; then
INNFLAGS="${INNFLAGS} ${R_FLAG}"
else
test -n "${R_PARAM}" && INNFLAGS="${INNFLAGS} ${R_PARAM}"
fi
if [ -n "${S_FLAG}" ]; then
INNFLAGS="${INNFLAGS} ${S_FLAG}"
else
test -n "${S_PARAM}" && INNFLAGS="${INNFLAGS} ${S_PARAM}"
fi
if [ -n "${T_FLAG}" ]; then
INNFLAGS="${INNFLAGS} ${T_FLAG}"
else
test -n "${TIMEOUT_PARAM}" && INNFLAGS="${INNFLAGS} ${TIMEOUT_PARAM}"
fi
if [ -n "${TIMELIMIT}" ]; then
INNFLAGS="${INNFLAGS} ${TIMELIMIT}"
else
test -n "${TIMELIMIT_PARAM}" \
&& INNFLAGS="${INNFLAGS} ${TIMELIMIT_PARAM}"
fi
## Start sending this site in the background.
export SITE HOST LOCKS BATCHFILE PROGNAME PPID SIZE TMPDIR
sh -c '
BATCHFILE=${HOST}.nntp
LOCK=${LOCKS}/LOCK.${HOST}
trap "rm -f ${LOCK} ; exit 1" 1 2 3 15
shlock -p $$ -f ${LOCK} || {
WHY="`cat ${LOCK}`"
echo "${PROGNAME}: [${PPID}:$$] ${HOST} locked ${WHY} `date`"
exit
}
if [ -f ${SITE}.work ] ; then
cat ${SITE}.work >>${BATCHFILE}
rm -f ${SITE}.work
fi
mv ${SITE} ${SITE}.work
if ctlinnd -s -t30 flush ${SITE} ; then
cat ${SITE}.work >>${BATCHFILE}
rm -f ${SITE}.work
test -n "${SIZE}" && shrinkfile -s${SIZE} -v ${BATCHFILE}
if [ -s ${BATCHFILE} ] ; then
echo "${PROGNAME}: [${PPID}:$$] begin ${HOST} `date`"
echo "${PROGNAME}: [${PPID}:$$] innxmit ${INNFLAGS} ${HOST} ..."
eval innxmit ${INNFLAGS} ${HOST} ${BATCH}/${BATCHFILE}
echo "${PROGNAME}: [${PPID}:$$] end ${HOST} `date`"
else
rm -f ${BATCHFILE}
fi
fi
rm -f ${LOCK}
' &
sleep 5
done
wait
rm -f ${INPUT}
echo "${PROGNAME}: [${PPID}] stop"